#!/bin/bash

# 清理测试环境的脚本
# 用法: ./cleanup_env.sh [--all] [--logs] [--db] [--reports]

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

# 显示帮助信息
show_help() {
    cat << EOF
清理测试环境的脚本

用法: $0 [选项]

选项:
    --all      清理所有内容（日志、数据库、报告）
    --logs     清理日志文件
    --db       清理数据库文件
    --reports  清理测试报告
    --help     显示此帮助信息

如果没有指定选项，默认清理所有内容
EOF
}

# 清理日志文件
cleanup_logs() {
    log_info "清理日志文件..."
    
    # 查找并删除日志文件
    find . -name "*.log" -type f -delete 2>/dev/null || true
    find . -name "*.log.*" -type f -delete 2>/dev/null || true
    
    # 清理特定目录的日志
    if [ -d "reports/logs" ]; then
        rm -rf reports/logs/*
        log_info "已清理 reports/logs 目录"
    fi
    
    if [ -d "logs" ]; then
        rm -rf logs/*
        log_info "已清理 logs 目录"
    fi
    
    log_success "日志文件清理完成"
}

# 清理数据库文件
cleanup_database() {
    log_info "清理数据库文件..."
    
    # 删除SQLite数据库文件
    find . -name "*.db" -type f -delete 2>/dev/null || true
    find . -name "*.db-journal" -type f -delete 2>/dev/null || true
    find . -name "test.db" -type f -delete 2>/dev/null || true
    
    # 清理缓存文件
    find . -name "*.pyc" -type f -delete 2>/dev/null || true
    find . -name "__pycache__" -type d -exec rm -rf {} + 2>/dev/null || true
    
    log_success "数据库文件清理完成"
}

# 清理测试报告
cleanup_reports() {
    log_info "清理测试报告..."
    
    if [ -d "reports" ]; then
        # 保留目录结构，只删除内容
        find reports -mindepth 1 -maxdepth 1 -type d -exec rm -rf {} + 2>/dev/null || true
        
        # 重新创建必要的目录
        mkdir -p reports/allure-results
        mkdir -p reports/allure-report
        mkdir -p reports/logs
        
        log_info "已清理 reports 目录内容"
    fi
    
    # 清理HTML报告
    find . -name "*.html" -type f -delete 2>/dev/null || true
    find . -name "report.html" -type f -delete 2>/dev/null || true
    
    # 清理覆盖率报告
    if [ -d "htmlcov" ]; then
        rm -rf htmlcov
        log_info "已清理覆盖率报告"
    fi
    
    if [ -d ".coverage" ]; then
        rm -rf .coverage
        log_info "已清理.coverage文件"
    fi
    
    log_success "测试报告清理完成"
}

# 清理临时文件
cleanup_temp_files() {
    log_info "清理临时文件..."
    
    # 清理Python缓存
    find . -name "*.pyc" -type f -delete 2>/dev/null || true
    find . -name "__pycache__" -type d -exec rm -rf {} + 2>/dev/null || true
    find . -name ".pytest_cache" -type d -exec rm -rf {} + 2>/dev/null || true
    
    # 清理其他临时文件
    find . -name "*.tmp" -type f -delete 2>/dev/null || true
    find . -name "*.temp" -type f -delete 2>/dev/null || true
    
    # 清理IDE配置文件（可选）
    find . -name ".vscode" -type d -exec rm -rf {} + 2>/dev/null || true
    find . -name ".idea" -type d -exec rm -rf {} + 2>/dev/null || true
    
    log_success "临时文件清理完成"
}

# 检查磁盘使用情况
check_disk_usage() {
    log_info "检查磁盘使用情况..."
    
    # 计算项目目录大小
    PROJECT_SIZE=$(du -sh . 2>/dev/null | cut -f1) || PROJECT_SIZE="未知"
    
    # 检查特定目录大小
    if [ -d "reports" ]; then
        REPORTS_SIZE=$(du -sh reports 2>/dev/null | cut -f1) || REPORTS_SIZE="0"
    else
        REPORTS_SIZE="0"
    fi
    
    log_info "项目总大小: $PROJECT_SIZE"
    log_info "报告目录大小: $REPORTS_SIZE"
}

# 主函数
main() {
    log_info "开始清理测试环境..."
    
    # 解析命令行参数
    CLEAN_LOGS=false
    CLEAN_DB=false
    CLEAN_REPORTS=false
    
    if [ $# -eq 0 ]; then
        # 默认清理所有
        CLEAN_LOGS=true
        CLEAN_DB=true
        CLEAN_REPORTS=true
    else
        for arg in "$@"; do
            case $arg in
                --all)
                    CLEAN_LOGS=true
                    CLEAN_DB=true
                    CLEAN_REPORTS=true
                    ;;
                --logs)
                    CLEAN_LOGS=true
                    ;;
                --db)
                    CLEAN_DB=true
                    ;;
                --reports)
                    CLEAN_REPORTS=true
                    ;;
                --help)
                    show_help
                    exit 0
                    ;;
                *)
                    log_error "未知选项: $arg"
                    show_help
                    exit 1
                    ;;
            esac
        done
    fi
    
    # 显示清理计划
    log_info "清理计划:"
    [ "$CLEAN_LOGS" = true ] && log_info "  - 日志文件"
    [ "$CLEAN_DB" = true ] && log_info "  - 数据库文件"
    [ "$CLEAN_REPORTS" = true ] && log_info "  - 测试报告"
    
    # 确认操作
    read -p "是否继续? (y/N): " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        log_info "操作已取消"
        exit 0
    fi
    
    # 执行清理操作
    [ "$CLEAN_LOGS" = true ] && cleanup_logs
    [ "$CLEAN_DB" = true ] && cleanup_database
    [ "$CLEAN_REPORTS" = true ] && cleanup_reports
    
    # 清理临时文件
    cleanup_temp_files
    
    # 检查磁盘使用情况
    check_disk_usage
    
    log_success "测试环境清理完成!"
}

# 脚本入口
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    main "$@"
fi